package br.uniceub.fsw.agenda.controller;

import br.uniceub.fsw.agenda.exception.BusinessException;
import br.uniceub.fsw.agenda.exception.DatabaseException;
import br.uniceub.fsw.agenda.model.vo.MenuVO;
import br.uniceub.fsw.agenda.model.vo.UsuarioVO;
import br.uniceub.fsw.agenda.model.facade.ManterUsuarioFacade;
import br.uniceub.fsw.agenda.util.HttpRequestWithModifiableParameters;
import br.uniceub.fsw.agenda.util.NumberUtils;
import br.uniceub.fsw.agenda.util.StringUtils;
import java.io.*;
import java.net.*;

import java.util.ArrayList;
import java.util.List;
import javax.servlet.*;
import javax.servlet.http.*;

/**
 *
 * @author Bruno
 */
public class ManterUsuarioController extends GenericServlet {
    private String nomeTela = "/manterUsuario/manterUsuario.jsp";
    public void iniciarTela(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        //Facades
        ManterUsuarioFacade facadeUsuario = new ManterUsuarioFacade();
        
        try {
            //buscar lista de menus
            List<MenuVO> listaMenu = facadeUsuario.findAllMenu();
            request.setAttribute("listaDeMenu", listaMenu);
            
            List<UsuarioVO> listaUsuario = facadeUsuario.findAllUsuario();
            request.setAttribute("listaDeUsuario", listaUsuario);
        } catch (BusinessException ex) {          
            request.setAttribute("mensagem", ex.getMessage());
        } catch (DatabaseException ex) {            
            request.setAttribute("mensagem", "Erro de comunicação com o banco de dados.");
        }        
        RequestDispatcher rd = request.getRequestDispatcher(nomeTela);
        rd.forward(request, response);        
    }   
    
    public void listar(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        
        //pegar parametros da tela
        String noUsuario = request.getParameter("noUsuario");

        //Facades
        ManterUsuarioFacade facadeUsuario = new ManterUsuarioFacade();
        
        List<UsuarioVO> listaUsuario = null;
        
        try {
            
            //buscar lista de menus
            List<MenuVO> listaMenu = facadeUsuario.findAllMenu();
            request.setAttribute("listaDeMenu", listaMenu);

            // Busca lista de Usuario
            listaUsuario = facadeUsuario.findAllUsuario(noUsuario);
            
            request.setAttribute("listaDeUsuario", listaUsuario);
            
        } catch (BusinessException ex) {
            request.setAttribute("mensagem", ex.getMessage());
        } catch (DatabaseException ex) {
            request.setAttribute("mensagem", "Erro de comunicação com o banco de dados.");
        }

        //passar um wrapper no lugar do verdadeiro request para alterar valores
        HttpRequestWithModifiableParameters wrapper = new HttpRequestWithModifiableParameters(request);
        
        wrapper.setParameter("idUsuario", "");
        wrapper.setParameter("noUsuario", "");
        wrapper.setParameter("dsLogin", "");
        wrapper.setParameter("dsSenha", "");
        
        iniciarTela(wrapper, response);        
    }
    
    public void inserir(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        //pegar parametros da tela
        Integer idUsuario = NumberUtils.toInteger(request.getParameter("idUsuario"));
        String noUsuario = request.getParameter("noUsuario");
        String dsLogin = request.getParameter("dsLogin");
        String dsSenha = request.getParameter("dsSenha");
        
        //facade
        ManterUsuarioFacade facade = new ManterUsuarioFacade();
        
        //montar entidade que sera gravada
        UsuarioVO usuario = new UsuarioVO();
        usuario.setIdUsuario(idUsuario);
        usuario.setNoUsuario(noUsuario);
        usuario.setDsLogin(dsLogin);
        usuario.setDsSenha(dsSenha);
        
        //passar um wrapper no lugar do verdadeiro request para alterar valores
        HttpRequestWithModifiableParameters wrapper = new HttpRequestWithModifiableParameters(request);
        
        try {
            facade.inserirUsuario(usuario);
                        
            wrapper.setParameter("idUsuario", "");
            wrapper.setParameter("noUsuario", "");
            wrapper.setParameter("dsLogin", "");
            wrapper.setParameter("dsSenha", "");
        } catch (BusinessException ex) {
             request.setAttribute("mensagem", ex.getMessage());
        } catch (DatabaseException ex) {
             request.setAttribute("mensagem", "Erro de comunicação com o banco de dados.");
        }        
        
        iniciarTela(wrapper, response);
    }

    public void alterar(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        //pegar parametros da tela
        Integer idUsuario = NumberUtils.toInteger(request.getParameter("idUsuario"));
        String noUsuario = request.getParameter("noUsuario");
        String dsLogin = request.getParameter("dsLogin");
        String dsSenha = request.getParameter("dsSenha");
        
        //facade
        ManterUsuarioFacade facade = new ManterUsuarioFacade();
        
        //montar entidade que sera atualizada
        UsuarioVO Usuario = new UsuarioVO();
        Usuario.setIdUsuario(idUsuario);
        Usuario.setNoUsuario(noUsuario);
        Usuario.setDsLogin(dsLogin);
        Usuario.setDsSenha(dsSenha);
        
        //passar um wrapper no lugar do verdadeiro request para alterar valores
        HttpRequestWithModifiableParameters wrapper = new HttpRequestWithModifiableParameters(request);
        
        //tratamento de erros
        if(StringUtils.isNullOrEmpty(noUsuario))
        {
            request.setAttribute("mensagem", "Nome do Usuario é obrigatório.");
            iniciarTela(wrapper, response);
            return;
        }
        if(StringUtils.isNullOrEmpty(dsLogin))
        {
            request.setAttribute("mensagem", "Login do Usuario é obrigatório.");
            iniciarTela(wrapper, response);
            return;
        }
        if(StringUtils.isNullOrEmpty(dsSenha))
        {
            request.setAttribute("mensagem", "Senha do Usuario é obrigatório.");
            iniciarTela(wrapper, response);
            return;
        }
        
        try {
            facade.alterarUsuario(Usuario);
                        
            wrapper.setParameter("idUsuario", "");
            wrapper.setParameter("noUsuario", "");
            wrapper.setParameter("dsLogin", "");
            wrapper.setParameter("dsSenha", "");
        } catch (BusinessException ex) {
             request.setAttribute("mensagem", ex.getMessage());
        } catch (DatabaseException ex) {
             request.setAttribute("mensagem", "Erro de comunicação com o banco de dados.");
        }        
        
        iniciarTela(wrapper, response);
    }

    public void consultar(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        //pegar parametros da tela
        Integer idUsuario = NumberUtils.toInteger(request.getParameter("idUsuario"));
        
        //facade
        ManterUsuarioFacade facadeUsuario = new ManterUsuarioFacade();
        
        //passar um wrapper no lugar do verdadeiro request para alterar valores
        HttpRequestWithModifiableParameters wrapper = new HttpRequestWithModifiableParameters(request);

        try {
            //buscar lista de menus
            List<MenuVO> listaMenu = facadeUsuario.findAllMenu();
            request.setAttribute("listaDeMenu", listaMenu);

            //montar entidade que sera apagada
            UsuarioVO usuario = facadeUsuario.findUsuarioById(idUsuario);

            wrapper.setParameter("idUsuario", usuario.getIdUsuario().toString());
            wrapper.setParameter("noUsuario", usuario.getNoUsuario());
            wrapper.setParameter("dsLogin", usuario.getDsLogin());
            
            List<UsuarioVO> listaUsuario = new ArrayList<UsuarioVO>();
            listaUsuario.add(usuario);
            
            request.setAttribute("listaDeUsuario", listaUsuario);
        } catch (BusinessException ex) {
             request.setAttribute("mensagem", ex.getMessage());
        } catch (DatabaseException ex) {
             request.setAttribute("mensagem", "Erro de comunicação com o banco de dados.");
        }        
        
        iniciarTela(wrapper, response);        
    }

    public void excluir(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        //pegar parametros da tela
        Integer idUsuario = NumberUtils.toInteger(request.getParameter("idUsuario"));
        
        //facade
        ManterUsuarioFacade facadeUsuario = new ManterUsuarioFacade();
        
        //passar um wrapper no lugar do verdadeiro request para alterar valores
        HttpRequestWithModifiableParameters wrapper = new HttpRequestWithModifiableParameters(request);
        
        try {
            //montar entidade que sera apagada
            UsuarioVO Usuario = facadeUsuario.findUsuarioById(idUsuario);
        
            facadeUsuario.excluirUsuario(Usuario);
                        
            wrapper.setParameter("idUsuario", "");
            wrapper.setParameter("noUsuario", "");
            wrapper.setParameter("dsLogin", "");
            wrapper.setParameter("dsSenha", "");
        } catch (BusinessException ex) {
             request.setAttribute("mensagem", ex.getMessage());
        } catch (DatabaseException ex) {
             request.setAttribute("mensagem", "Erro de comunicação com o banco de dados.");
        }        
        
        iniciarTela(wrapper, response);
    }

}
